d8f2ac3e6ee26fc338f43c0512379a0ff98ea236,hbase-common/src/main/java/org/apache/hadoop/hbase/io/BoundedByteBufferPool.java,BoundedByteBufferPool,putBuffer,#ByteBuffer#,110
Before Change
try {
success = this.buffers.offer(bb);
if (success) {
this.totalReservoirCapacity += bb.capacity();
average = this.totalReservoirCapacity / this.buffers.size(); // size will never be 0.
}
} finally {
After Change
countOfBuffers++;
assert 0 < countOfBuffers && countOfBuffers <= maxToCache;
totalCapacity = toTotalCapacity(prevState) + bb.capacity();
if (totalCapacity < 0) {
if (LOG.isWarnEnabled()) {
LOG.warn("Overflowed total capacity.");
}
return;
}
long state = toState(countOfBuffers, totalCapacity);
if (stateRef.compareAndSet(prevState, state)) {
break;
}
}
// ConcurrentLinkQueue#offer says "this method will never return false"
buffers.offer(bb);
int runningAverageUpdate = Math.min(
totalCapacity / countOfBuffers, // size will never be 0.
maxByteBufferSizeToCache);
while (true) {
int prev = runningAverageRef.get();
if (prev >= runningAverageUpdate || // only rises, never recedes
runningAverageRef.compareAndSet(prev, runningAverageUpdate)) {
break;
}